package com.ray.util.baidu;

import java.util.HashMap;

import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baidu.aip.imagesearch.AipImageSearch;
import com.ray.exception.ServiceException;

/**
 * 百度商品图片搜索工具
 * @author Shensg
 *
 * 2018年10月5日
 * 
 * 注意：
 * 	具有免费调用额度的接口，超过每天的免费额度后会返回错误码：17，错误信息：Open api daily request limit reached（每天流量超限额）
 */
public class BaiduProductPicSearchUtils {
	public static Logger logger = LoggerFactory.getLogger(BaiduProductPicSearchUtils.class);
	/**
	 * 商品图检索—入库-本地图片
	 * @param brief 检索时原样带回,最长256B。
	 * @param image 本地地址
	 * @param class_id1 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @param class_id2 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @return
	 * 	log_id 唯一的log id，用于问题定位
	 * 	cont_sign	 输入图片签名，可用于删除
	 */
	public static JSONObject productPicInsertForLocal(Brief brief,String image,int class_id1,int class_id2) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		HashMap<String, String> options = new HashMap<String, String>();
	    options.put("brief", brief.toJson());
	    options.put("class_id1", class_id1+"");
	    options.put("class_id2", class_id2+"");
	    JSONObject res = client.productAdd(image, options);
	    if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
		return res;
	}
	/**
	 * 商品图检索—检索-本地图片
	 * @param image 本地地址
	 * @param tagLogic 检索时tag之间的逻辑， 0：逻辑and，1：逻辑or
	 * @param pn 分页功能，起始位置，例：0。未指定分页时，默认返回前300个结果；接口返回数量最大限制1000条，例如：起始位置为900，截取条数500条，接口也只返回第900 - 1000条的结果，共计100条
	 * @param rn 分页功能，截取条数，例：250
	 * @param class_id1 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @param class_id2 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @return	
	 */
	public static JSONObject productPicSelectForLocal(byte[] image,int pn,int rn,int class_id1,int class_id2) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		// 传入可选参数调用接口
	    HashMap<String, String> options = new HashMap<String, String>();
	    options.put("pn", pn+"");
	    options.put("rn", rn+"");
	    options.put("class_id1", class_id1+"");
	    options.put("class_id2", class_id2+"");
	    JSONObject res = client.productSearch(image, options);
	    if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
		return res;
	}
	/**
	 * 更新图库中图片的摘要和分类信息-本地图片（具体变量为brief、）
	 * @param brief 检索时原样带回,最长256B。
	 * @param image
	 * @return
	 * 	log_id 唯一的log id，用于问题定位
	 */
	public static JSONObject productPicUpdateForLocal(Brief brief,String image,int class_id1,int class_id2) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		// 传入可选参数调用接口
		HashMap<String, String> options = new HashMap<String, String>();
	    options.put("brief", brief.toJson());
	    options.put("class_id1", class_id1+"");
	    options.put("class_id2", class_id2+"");
	    JSONObject res = client.productUpdate(image, options);
	    if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
		return res;
	}
	/**
	 * 商品图检索—删除-本地
	 * @param contSign
	 * @param image
	 * @return
	 */
	public static JSONObject productPicDeleteForLocal(String image) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		// 传入可选参数调用接口
		HashMap<String, String> options = new HashMap<String, String>();
		JSONObject res = client.productDeleteByImage(image, options);
		if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
		return res;
	}
	
	/**
	 * 商品图检索—入库-远程图片
	 * @param brief 检索时原样带回,最长256B。
	 * @param class_id1 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @param class_id2 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @return
	 * 	log_id 唯一的log id，用于问题定位
	 * 	cont_sign	 输入图片签名，可用于删除
	 */
	public static JSONObject productPicInsertForRemote(Brief brief,String url,int class_id1,int class_id2) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		HashMap<String, String> options = new HashMap<String, String>();
	    options.put("brief", brief.toJson());
	    options.put("class_id1", class_id1+"");
	    options.put("class_id2", class_id2+"");
	    byte[] img = ImageUtils.readUrl(url,"GET");
	    JSONObject res = client.productAdd(img, options);
	    if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
	    return res;
	}
	
	/**
	 * 商品图检索—检索-远程图片
	 * @param  	1 - 65535范围内的整数，tag间以逗号分隔，最多2个tag。样例："100,11" ；检索时可圈定分类维度进行检索
	 * @param image 本地地址
	 * @param tagLogic 检索时tag之间的逻辑， 0：逻辑and，1：逻辑or
	 * @param pn 分页功能，起始位置，例：0。未指定分页时，默认返回前300个结果；接口返回数量最大限制1000条，例如：起始位置为900，截取条数500条，接口也只返回第900 - 1000条的结果，共计100条
	 * @param rn 分页功能，截取条数，例：250
	 * @param class_id1 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @param class_id2 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @return
	 * 
	 */
	public static JSONObject productPicSelectForRemote(String url,int pn,int rn,int class_id1,int class_id2) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		// 传入可选参数调用接口
	    HashMap<String, String> options = new HashMap<String, String>();
	    options.put("pn", pn+"");
	    options.put("rn", rn+"");
	    options.put("class_id1", class_id1+"");
	    options.put("class_id2", class_id2+"");
	    byte[] img = ImageUtils.readUrl(url,"GET");
	    JSONObject res = client.productSearch(img, options);
	    if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
		return res;
	}
	/**
	 * 更新图库中图片的摘要和分类信息-远程图片（具体变量为brief、）
	 * @param brief 检索时原样带回,最长256B。
	 * @param url
	 * @param class_id1 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @param class_id2 商品分类维度1，支持1-60范围内的整数。检索时可圈定该分类维度进行检索
	 * @return
	 * 	log_id 唯一的log id，用于问题定位
	 */
	public static JSONObject productPicUpdateForRemote(Brief brief,String url,int class_id1,int class_id2) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		// 传入可选参数调用接口
		HashMap<String, String> options = new HashMap<String, String>();
	    options.put("brief", brief.toJson());
	    options.put("class_id1", class_id1+"");
	    options.put("class_id2", class_id2+"");
	    byte[] img = ImageUtils.readUrl(url,"GET");
	    JSONObject res = client.productUpdate(img, options);
	    if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
		return res;
	}
	/**
	 * 商品图检索—删除-远程图片
	 * @param contSign
	 * @param url
	 * @return
	 */
	public static JSONObject productPicDeleteForRemote(String url) {
		AipImageSearch client =AipImageSearchUtil.getConfig();
		// 传入可选参数调用接口
		HashMap<String, String> options = new HashMap<String, String>();
		byte[] img = ImageUtils.readUrl(url,"GET");
		JSONObject res = client.productDeleteByImage(img, options);
		if(res.has("error_code")) {
	    	logger.error(res.toString());
	    	throw new ServiceException(res.toString());
	    }
		return res;
	}
	
}
